#include "widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
}

Widget::~Widget()
{

}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.fillRect(0, 0, width(), height(), Qt::black);

    painter.setClipRegion(QRegion(width() / 2 - 100, height() / 2 - 100, 200, 200)); // 设置一个裁剪区域
    painter.setPen(Qt::white); // 设置画笔颜色
    painter.drawRect(painter.clipRegion().boundingRect());

    painter.setPen(Qt::yellow);
    painter.setBrush(QBrush(Qt::red));
    painter.drawEllipse(width() / 2 - 80, height() / 2 - 80, 200, 200); // 超出裁剪区域的不画

    painter.drawLine(10, 10, 50, 50); // 此时setClipping()为true，在裁剪区域之外不会显示
    painter.setClipping(false); // setClipRegion()方法会自动设置setClipping()为true。当此次绘画结束后；如果后续绘画的区域没有在裁剪区域内，则不会显示；这时需要在裁剪绘画结束后调用setClipping()传入false，使裁剪失效，这样就可以正常显示了。
    painter.drawLine(0, 0, 100, 100); // 正常显示
}
